﻿using User.Global.Contracts.Message;

namespace User.Global.Contracts.Membership
{
    public interface IDiMembership<TUser>
    {
        /// <summary>
        /// Userlogin mit den übergebenen Userdaten
        /// </summary>
        /// <param name="username">Username für den Login</param>
        /// <param name="password">Userpasswort für den Login</param>
        /// <param name="rememberMe">Soll der Login "gemerkt" werden</param>
        /// <returns>TRUE->Login erfolgreich | FALSE->Fehler beim Login</returns>
        bool Login(string username, string password, bool rememberMe = false);

        /// <summary>
        /// Loggt den aktuellen User aus.
        /// </summary>
        void Logout();

        /// <summary>
        /// Erstellt den übergebenen User in der DB mit PW und Username
        /// </summary>
        /// <param name="password">das Passwort welches gesetzt werden soll</param>
        /// <param name="username">der Username der gesetzt werden soll</param>
        /// <param name="member">Der User der angelegt werden soll, hier wird entsprechend auch der Username und das Passwort gesetzt</param>
        /// <returns>TRUE->User wurde erfolgreich angelegt | FALSE->Fehler beim Anlegen des Users</returns>
        bool CreateUser(string username, string password, TUser member);

        /// <summary>
        /// Prüft ob der übergebene Username beireits im System vorhanden ist.
        /// </summary>
        /// <param name="userName">Der Username der überprüft werden soll</param>
        /// <returns>TRUE->Bereits vorhanden | FALSE->User existiert noch nicht</returns>
        bool Exists(string userName);

        /// <summary>
        /// Ändert das Passwort des Users
        /// </summary>
        /// <param name="userId">Die UserId für den das PW geändert werden soll</param>
        /// <param name="oldPassword">Das alte Passwort welches stimmen muss</param>
        /// <param name="newPassword">Das neue Passwort welches gesetzt werden soll</param>
        /// <returns>TRUE->Passwort setzten war erfolgreich | FALSE->Fehler beim setzten des neuen Passworts</returns>
        bool ChangePassword(long userId, string oldPassword, string newPassword);

        /// <summary>
        /// Setzten des Passworts für den übergebenen User, hier wird nur das neue PW abgefragt.
        /// </summary>
        /// <param name="username">Der Username für den das PW geändert werden soll</param>
        /// <param name="newPassword">Das neue Passwort welches gesetzt werden soll</param>
        bool ChangePassword(string username, string newPassword);

        /// <summary>
        /// Setzten des Passworts für den übergebenen User, hier wird nur das neue PW abgefragt.
        /// </summary>
        /// <param name="id">Die User-Id für die das PW geändert werden soll</param>
        /// <param name="newPassword">Das neue Passwort welches gesetzt werden soll</param>
        bool ChangePassword(long id, string newPassword);

        /// <summary>
        /// Erstellt ein Reset PW Token,  was z.B. per Mail versendet wird.
        /// </summary>
        /// <param name="username">Der Username für den das ResetToken  ist.</param>
        /// <param name="tokenExpirationInMinutesFromNow">Die Ablaufzeit in Minuten für das PW Token</param>
        /// <returns>Resetstring in dem der Username und auch die Ablaufzeit mit "enthalten sind"</returns>
        string GeneratePasswordResetToken(string username, int tokenExpirationInMinutesFromNow = 1440);

        /// <summary>
        /// Setzt das PW anhand des übergebenen Tokens zurück
        /// </summary>
        /// <param name="passwordResetToken">Das ResetPW Token für den User</param>
        /// <param name="newPassword">Das neue PW welches gesetzt werden soll</param>
        /// <returns>TRUE->PW erfolgreich gesetzt  | FASLE->Fehler beim Setzten des PW</returns>
        bool ResetPassword(string passwordResetToken, string newPassword);

        /// <summary>
        /// Reaktivieren eines gesperrten Accounts, wenn dieser durch zu viele Fehllogins gesperrt wurde
        /// </summary>
        /// <param name="username">Der Username der wieder aktiviert werden soll</param>
        /// <returns>TRUE->Reaktivierung erfolgreich | FALSE->Fehler beim Reaktivieren des Accounts</returns>
        bool ActivateLockedAccount(string username);

        /// <summary>
        /// Deaktivieren eines Accounts - Dieser Account kann sich nicht mehr einloggen.
        /// </summary>
        /// <param name="userId">Die UserId die deaktiviert werden soll</param>
        bool DeactivateAccount(long userId);

        /// <summary>
        /// Aktivieren eines Accounts der Deaktiviert wurde.
        /// </summary>
        /// <param name="userId">Die UserId die aktiviert werden soll</param>
        bool ActivateAccount(long userId);

        /// <summary>
        /// Allgemeine Messageverwaltung für die jeweiligen Meldungen die ausgegeben werden sollen.
        /// </summary>
        IAddMessage Message { get; set; }
    }
}
